// 什么是联合类型
//    type 联合类型 = 类型1 | 类型2
// 接口的作用是什么
//    声明一组参数 可以有多种类型
// type 和 interface什么区别
//    相同点 描述 数据 类型  不同点  type 可以声明基本类型 联合类型 元组  interface 有 extends 属性
// 怎么定义可选属性
//    ?
// in 关键字的作用
//    检测 某个属性是否在 实例中
// 泛型 <T>
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var a;
// 类 一种面向对象编程语言的结构
var Greeter = /** @class */ (function () {
    function Greeter(message) {
        // #name :string es6 如果想声明私有变量
        // ts的私有变量
        this.name = '小蓝'; // 目的 : 只允许 每部调用 axios
        // 成员属性
        this.greeting = '123'; // es7
        // 成员属性
        this.greeting = message;
    }
    Greeter.getClassName = function () {
        return 'Classname is Greeter';
    };
    Greeter.prototype.getName = function () {
        return this.name;
    };
    // static  声明的属性或者方法 不再属于实例 this   属于类本身
    Greeter.cname = 'Greeter';
    return Greeter;
}());
console.log(Greeter.cname);
console.log(Greeter.getClassName());
var greeter = new Greeter('小红');
// console.log(greeter.fullName = '123');
// console.log(greeter.getName());
var Animal = /** @class */ (function () {
    function Animal(theName) {
        this.name = theName;
    }
    Animal.prototype.move = function (distance) {
        console.log(this.name + " move " + distance + " \u7C73");
    };
    return Animal;
}());
var Snake = /** @class */ (function (_super) {
    __extends(Snake, _super);
    function Snake(name) {
        return _super.call(this, name) || this; // 只要继承  调用父类的构造
    }
    Snake.prototype.move = function (distance) {
        // 调用父类的方法
        // this.
        // Animal.
        // Snake.
        // Animal实例.
        // Snake.move() ×
        // this.move(10) // 死循环
        _super.prototype.move.call(this, 20); // super animal 实例 只能调用父类的方法
    };
    return Snake;
}(Animal));
var snake = new Snake('王牌眼镜蛇');
snake.move(10);
//多态 抽象类  抽象方法
// 声明抽象类  abstract :抽象类的关键字
var Person = /** @class */ (function () {
    function Person(name) {
        this.name = name;
    }
    return Person;
}());
// 实现类
var Liu = /** @class */ (function (_super) {
    __extends(Liu, _super);
    function Liu(name) {
        return _super.call(this, name) || this;
    }
    Liu.prototype.say = function (word) {
        console.log(word + " \u773C\u775B \u6E29\u67D4");
        console.log(word + " \u6027\u683C \u5584\u826F");
        console.log(word + " \u505A\u996D \u8D24\u60E0");
    };
    Liu.prototype.say1 = function (word) {
        console.log(word + " \u773C\u775B \u6E29\u67D4");
        console.log(word + " \u6027\u683C \u5584\u826F");
        console.log(word + " \u505A\u996D \u8D24\u60E0");
    };
    return Liu;
}(Person));
var liu = new Liu('刘天一');
liu.say('刘天一');
// liu.say1('高钰松', 20);
// 多态 人 移情别恋
// 多态: 多个方法 都叫同一个名字 参数或者返回值不同 就叫多态
// 喜欢的人
// 属性 name  age  size  sex
// like play eat drink la
// 写一个抽象类 然后具体给实现出来
// 预习 webpack + react + ts 环境
